<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>字节代码输出</title>
</head>
<body>
  <script>
    // 1.局部作用域和全局作用域
    let val = 1;
    function foo() {
      console.log(val);
    }
    function bar() {
      let val = 2;
      foo();
    }
    bar();


    // 2.this指向
    // window.name = 'ByteDance';
    // function A() {
    //   this.name = 123;
    // }
    // A.prototype.getA = function () {
    //   return this.name + 1;
    // };
    // let a = new A();
    // let funcA = a.getA;
    // console.log(funcA());
    // // 解释完上面答下面这种情况
    // console.log(a.getA());


    // 3.this指向(call)
    // const obj = {
    //   birth: 1990,
    //   getAge(year) {
    //     let fn = y => y - this.birth;
    //     return fn.call({ birth: 2000 }, year);
    //   },
    // };
    // console.log(obj.getAge(2020));
 
    // 4.执行顺序 ***
    // async function async1() {
    //   console.log('async1 start');
    //   await async2();
    //   console.log('async1 end');
    // }
    // async function async2() {
    //   console.log('async2');
    // }
    // console.log('script start');
    // setTimeout(() => {
    //   console.log('setTimeout');
    // }, 0);
    // async1();
    // new Promise(function (resolve) {
    //   console.log('promise1');
    //   resolve();
    // }).then(function () {
    //   console.log('promise2');
    // });
    // console.log('script end');

    // 1. 也是关于this的，还有闭包，和一面差不多
    // 2. 作用域？变量提升？
    // for(var i=0;i<5;i++){
    //   setTimeout(()=>{
    //     console.log(i);
    //   },0)
    // }
    // 如果要按顺序输出
    // 1. 块级作用域
    // for(let i=0;i<5;i++){
    //   setTimeout(()=>{
    //     console.log(i);
    //   },0)
    // }
    // 2.闭包
    // for(var i=0;i<5;i++){
    //   (f = (j) =>{
    //     setTimeout(()=>{
    //       console.log(j)
    //     },0)
    //   })(i)
    // }

    //3. 也是关于event loop的，和一面的执行顺序差不多，让具体解释了一下宏任务和微任务

    // console.log(typeof typeof typeof null)

    // console.log('abcdcba'.replace(/c/g, 'h'))

    // console.log('abcdCba'.replace(/c/g, 'h'))

    // var a = {
    //   name: 'A',
    //   fun: function(){
    //     console.log(this.name);
    //   }
    // };
    // a.fun(); //A
    // a.fun.call({name: 'B'});//B
    // var fun1 = a.fun;
    // fun1(); //

    // var a = {
    //   name: 'A',
    //   fun: () => {console.log(this.name);}
    // };
    // a.fun();
    // a.fun.call({name: 'B'});
    // var fun1 = a.fun;
    // fun1();

    // console.log(typeof Date)
    // console.log(typeof Date()) 
    // console.log(typeof new Date)
    // console.log(typeof new Date()) 

    // 隐式转换
    // if ([]) console.log(1);
    // if ([].length) console.log(2);
    // if ([] == 0) console.log(3);
    // if ({} === {}) console.log(4);

    // function Person() {}
    // let p = new Person();
    // // 写出p与Person的关系（尽可能多）
    // console.log(p.__proto__ === Person.prototype); // true
    // console.log(p.constructor === Person);  // true
    // console.log(Person.prototype.__proto__ === Object.prototype);  // true
    // console.log(p.__proto__.__proto__=== Object.prototype);  // true
    // console.log(p instanceof Person);  // true
    // console.log(p instanceof Object);  // true


    // 折磨
    // function Foo() {
    //     getName = function() {
    //         console.log('1');
    //     }
    //     return this;
    // }
    // Foo.getName = function() { console.log('2'); }
    // Foo.prototype.getName = function() { console.log('3'); }
    // var getName = function() {
    //     console.log('4');
    // }
    // function getName(){
    //   console.log('5')
    // }
    // // 判断以下输出
    // Foo.getName();
    // getName();
    // Foo().getName();
    // getName();
    // new Foo.getName();
    // new Foo().getName();
    // new new Foo().getName();

    
  </script>
</body>
</html>